#ifndef LISTAIMP_CPP
#define LISTAIMP_CPP
#include "ListaImp.h"
template<class T>
ListaImp<T>::ListaImp()
{
	this->ppio = NULL;
	this->fin=NULL;
	this->largo = 0;
}
//template<class T>
//ListaImp<T>::ListaImp(ListaImp<T> &l)
//{
//	NodoLista<T>* aux;
//	this->ppio = NULL;
//	this->fin=NULL;
//	aux=l.ppio;
//	if(this != &l){
//		while(aux!=NULL){
//			this->AgregarFinal(aux->dato);
//			aux=aux->sig;
//		}
//	}
//}
template<class T>
ListaImp<T>::ListaImp(Puntero<ListaImp<T>> &l)
{
	NodoLista<T>* aux;
	this->ppio = NULL;
	this->fin=NULL;
	aux=l->ppio;
		while(aux!=NULL){
			this->AgregarFinal(aux->dato);
			aux=aux->sig;
		}
}
template<class T>
ListaImp<T>::~ListaImp()
{
	NodoLista<T>* borrar;
	while(ppio != NULL){
		borrar = ppio;
		ppio = ppio->sig;
		delete borrar;
	}
	ppio = NULL;
	fin= NULL;

	
}
template<class T>
void ListaImp<T>::Agregar(T &e)
{//alta ordenada
	//NodoLista<T>* aux = this->ppio;
	/*NodoLista<T>* aux = this->ppio;
	NodoLista<T>* nuevo = new NodoLista<T>(e,aux);
	this->ppio = nuevo;	
	this->largo = this->largo +1;*/
NodoLista<T>* aux;
NodoLista<T>* nuevo = new NodoLista<T>();
NodoLista<T>* ant;
nuevo->dato = e;
if(this->ppio==NULL){ 
nuevo->sig = this->ppio;
this->ppio = nuevo;
}else{ 
aux = this->ppio;
while(aux != NULL){ 
ant = aux;
aux = aux->sig;
}
nuevo->sig = ant->sig;
ant->sig = nuevo;
}
//delete aux;
//delete nuevo ;
//delete ant;
}
template<class T>
void ListaImp<T>::AgregarFinal(T &e)
{
	NodoLista<T>* nuevo = new NodoLista<T>();
	nuevo->dato = e;
	nuevo->sig=NULL;
	if(this->ppio==NULL){
	ppio=fin=nuevo;


 	}else{
			fin->sig=nuevo;
			//fin->dato=nuevo->dato;
			fin=nuevo;
		}
							
//delete nuevo;
}
template<class T>
void ListaImp<T>::AgregarPpio(T &e)
{
	NodoLista<T>* nuevo = new NodoLista<T>();
	NodoLista<T>* aux;
	nuevo->dato = e;
	nuevo->sig=NULL;
	if(this->ppio==NULL){
	ppio=fin=nuevo;


 	}else{
		nuevo->sig=ppio;
		ppio=nuevo;
	}
							
//delete nuevo;
}
template<class T>
void ListaImp<T>::Borrar(T &t){
	NodoLista<T>* anterior =NULL;
	NodoLista<T>* navegador =this->ppio;
	bool exito = false;
	while(!exito){
		if(navegador->dato==t){
			if(anterior==NULL){
				this->ppio=navegador->sig;
				delete(navegador);
				exito = true;
			}else{
				if(navegador->sig!=NULL){
				anterior->sig=navegador->sig;
				delete(navegador);	
				exito = true;
				}else{
					fin=anterior;
					fin->sig=NULL;
					delete navegador;
					exito=true;
				}
			}
		}else{
			anterior=navegador;
			navegador=navegador->sig;
			if (navegador==NULL) exito = true;
		}
	}
}
template<class T>
void ListaImp<T>::Vaciar()
{
	//assert(this->largo==0);// lo cambie para arriba
	while(!(this->EsVacia())){
		NodoLista<T>* aux=this->ppio;
		this->ppio=aux->sig;
		delete(aux);
		this->largo--;
	}
}
template<class T>
bool ListaImp<T>::EsVacia() 
{
	return (this->ppio==NULL); 
}
template<class T>
unsigned int ListaImp<T>::Largo()
{
	return this->largo;
}
template<class T>
bool ListaImp<T>::EsMiembro(T &t)
{
	NodoLista<T> *navegador = ppio;
	while(navegador!=NULL && navegador->dato != t){
		navegador = navegador->sig;
	}
	if(navegador == NULL) return false;
	else return true;

}
template<class T>
Puntero<Iterador<T>> ListaImp<T>::ObtenerIterador() const 
{
return new IteradorListaImp<T>(*this);

}
template<class T>
void ListaImp<T>::mostrar(int)
{
}
#endif